/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.ecommerce.entity.impl;

import br.com.ecommerce.entity.IEntity;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.LinkedList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.validation.Valid;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import org.hibernate.validator.constraints.NotEmpty;

/**
 *
 * @author rpateixeira
 */
@Entity
@Table(name="PRODUTOS")
@NamedQueries({
    @NamedQuery(name="Produto.findProdutosByName",query="SELECT prod FROM Produto prod where prod.nome like :productName")
})
public class Produto implements IEntity,Serializable{

    @Id
    @SequenceGenerator(name = "PRODUTO_GENERATOR", sequenceName = "public.produtoSequence", initialValue = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE,generator="PRODUTO_GENERATOR")
    @Column(name="SEQ_PRODUTO")
    private Long id;
    @NotNull
    @NotEmpty
    @Column(unique=true,nullable=false)
    private String nome;
    @NotNull
    @Column(nullable=false)
    private BigDecimal custo;
    @NotNull(message="Favor Selecione 1 categoria!!")
    @ManyToOne(cascade=CascadeType.MERGE)
    @JoinColumn(name="ID_CATEGORIA",referencedColumnName="SEQ_CATEGORIA")
 //   @Valid
    private Categoria categoria;
    @NotNull
    @NotEmpty
    @Column(name="ESPECIFICACOES")
    private String especificacao;
    @NotNull
    @Min(value=0,message="Favor Informe a quantidade do produto!!")
    @Column(name="QUANTIDADE_ESTOQUIE",nullable=false)
    private Integer stock;
    @OneToMany(cascade=CascadeType.ALL,mappedBy="produto")
    private List<ItemVenda> itensVenda;
    @OneToMany(cascade=CascadeType.ALL,mappedBy="produto",orphanRemoval=true)
    private List<CallOnAvaliable>callers;
    
    @Override
    public Long getId() {
        return this.id;
    }
    
    public Categoria getCategoria() {
        return categoria;
    }

    public void setCategoria(Categoria categoria) {
        this.categoria = categoria;
    }
    
    public BigDecimal getCusto() {
        return custo;
    }

    public void setCusto(BigDecimal custo) {
        this.custo = custo;
    }
    
    public String getEspecificacao() {
        return especificacao;
    }

    public void setEspecificacao(String especificacao) {
        this.especificacao = especificacao;
    }
    
    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }
    
    public Integer getStock() {
        return stock;
    }

    public void setStock(Integer stock) {
        this.stock = stock;
    }
   
    public List<ItemVenda> getItensVenda() {
        if(itensVenda==null){
            itensVenda=new LinkedList<ItemVenda>();
        }
        return itensVenda;
    }

    public void setItensVenda(List<ItemVenda> itensVenda) {
        this.itensVenda = itensVenda;
    }

    public List<CallOnAvaliable> getCallers() {
        if(callers==null){
            callers=new LinkedList<CallOnAvaliable>();
        }
        return callers;
    }

    public void setCallers(List<CallOnAvaliable> callers) {
        this.callers = callers;
    }

    public void addCaller(CallOnAvaliable call){
        call.setProduto(this);
        getCallers().add(call);
    }
}
